package org.db.ui;

import java.awt.Toolkit;

import javax.swing.JTextField;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;

/**
 * JTextField dass nur Double Zahlen als Eingabe zulässt und Komma durch Punkt
 * ersetzt.
 * 
 * @author Lutz
 * 
 */
public class DoubleTextField extends JTextField {

	/**
	 * 
	 */
	private static final long serialVersionUID = 3775120287773008723L;

	public DoubleTextField() {
		super();
		setDocument(new DoubleDocument(false));
	}

	public DoubleTextField(boolean allowNegativeNumber) {
		super();
		setDocument(new DoubleDocument(allowNegativeNumber));
	}

	public void setValue(double value) {
		setText(String.valueOf(value));
	}

	public double getValue() {
		double value = 0;
		if (!getText().isEmpty()) {
			value = Double.parseDouble(getText());
		}
		return value;
	}
}

class DoubleDocument extends PlainDocument {
	/**
	 * 
	 */
	private static final long serialVersionUID = -6800676233693573564L;

	private boolean bDot = false;

	private boolean allowNegativeNumber = false;

	public DoubleDocument() {
	}

	public DoubleDocument(boolean allowNegativeNumber) {
		this.allowNegativeNumber = allowNegativeNumber;
	}

	public void insertString(int offset, String s, AttributeSet attributeSet)
			throws BadLocationException {
		if (allowNegativeNumber && s.equals("-") && getLength() == 0) {
			// wenn erstes Zeichen ein - dann nichts machen
		} else {
			try {
				if (s.equals(",")) // ersetzt den , durch einen Punkt
					s = ".";
				bDot = getText(0, getLength()).indexOf(".") == -1
						? false
						: true; // merkt
				// sich
				// ob
				// ein
				// Punkt
				// oder
				// nicht

				if (s.length() > 1) {
					// wenn der String größer als 1 ist, ist es eine ganze IP
					// und
					// somit eine Schleife
					for (int x = 0; x != s.length(); x++)
						insertString(x,
								s.substring(x, x + 1).replaceFirst(",", "."),
								null); // ersetzt
										// ,
										// durch
										// .

					// mach gar nix, weil die for-Schleife alles macht!
					return;
				}

				// wenn das aktuelle Zeichen kein punkt ist oder wenn es ein
				// Punkt
				// ist und schon ein Punkt eingegegeben ist
				else if (!s.equals(".") || bDot)
					Double.parseDouble(s);

			} catch (Exception ex) {
				Toolkit.getDefaultToolkit().beep();
				return;
			}

		}
		super.insertString(offset, s, attributeSet);

	}
}
